package s2elinshu.swing;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JDialog;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.UIManager;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class SwingProject extends JFrame {
	// 스윙 기본 시나리오
	// 1. setBounds를 이용한 JFrame 크기 지정 (x 좌표, y 좌표, 가로, 세로)
	// 2. 화면 정중앙에 표시하는 것은 Source->setLocationRelativeTo(null)
	// 3. 프로그램 아이콘 추가는 Design->JFrame->iconImage->classpath에서 아이콘을 불러온 뒤 적용
	// 4. 프로그램 제목 추가는 Design->JFrame->title 수정.
	// 5. 크기 변경 불가 setResizable 체크 풀어준다
	// 6. splash 화면 표시(잠깐 떴다가 사라지는 효과.............)
	// 	META-INF 폴더에 MANIFEST.MF파일 작성
	// 	SplashScreen-Image: 항목 추가
	// 	Splash 화면 뜨는 시간 지연 : Thread.sleep(2000)
	// 7. 실행 가능한 jar 파일 생성(6번 과정과 관련)
	// 	File ->>Export->>Java->>JAR file
	// 8.메뉴 추가
	// 	메뉴 추가 순서 : JMenuBar->>JMenu->>JMenuItem
	// 	JFrame에 JMenuBar 객체를 만들고 setJMenuBar로 등록
	// 	JMenu 객체를 만들고 JMenuBar에 .add로 등록
	// 	JMenuItem 객체를 만들고 JMenu에 add로 등록
	// 	JMenuItem의 setIcon을 이용해서 메뉴 아이콘 등록(size : 20 x 20이 적당하다)
	// 	JMenuItem의 .addActionListener를 이용해서 클릭(actionPerformed) 이벤트 추가
	// 	간단한 대화상자는 JOptionPane의 showMessageDialog를 이용(키 하나)
	// 	showConfirmDialog를 이용할 경우 키가 3개 뜸
	// 9.룩앤필 look and feel
	// 	GUI 측면과 디자인 구성에 사용하는 용어
	// 	색상, 모양, 레이아웃, 서체, 버튼, 박스, 메뉴등의 동적 요소를 의미
	// 	자바에서 기본으로 사용하는 룩앤필은 다소 밋밋하기 때문에 교체 할 수 있도록
	// 	특별한 API 제공
	// 	UIManager.setLookAndFeel()
	// 10.종료 시점 제어
	// 	defaultCloseOperation에서 DO_NOTHING_ON_CLOSE로 변경
	// 	swing은 이벤트 처리가 핵심(event-driven)인 GUI 환경임
	//	ActionListener - actionPerform임
	// 	이벤트 메서드를 작성하는 방법 3가지 중
	//    익명 클래스 기법을 자주 사용하지만 가능하다면 독립된 이벤트 처리 클래스를 
	//	사용하는 것을 추천 함.
	//	한편, 윈도우 닫기시 이벤트를 걸고 싶으면 WindowListener-windowClosing을 사용
	//	하지만, WindowAdapter를 이용해서 처리하는 것을 추천
	// 11.이미지 처리
	//	JLabel을 이용 : setIcon
	//	단, 이미지 크기가 표시영역보다 크면 이미지 크기를 줄여야 전체가 다 보임
	//    JPane을 이용 : setIcon
	//	
	// 12.모달창(새창) 생성
	//	Modal 대화상자 : 
	//	Modaless 대화상자 : 
	// 13.대화상자 닫기 이벤트 처리(AboutSwingProject)
	//    dispose();
	//   *System.exit(0) :  AboutSwingProject(자식) & SwingProject(부모) 모두 꺼버림
	// 14.대화상자, GroupLayout
	//	우편번호 찾기 기능 구현
	

	private JPanel contentPane;
	private static String MetalLook = "javax.swing.plaf.metal.MetalLookAndFeel";
	private static String NimbusLook = "javax.swing.plaf.nimbus.NimbusLookAndFeel";
	private static SwingProject frame;  // 12번
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					// Splash 화면 뜨는 시간 지연 : Thread.sleep(2000)
					Thread.sleep(2000); // 6번
					// 룩앤필 변경 시작
					JFrame.setDefaultLookAndFeelDecorated(true);
					JDialog.setDefaultLookAndFeelDecorated(true);
					UIManager.setLookAndFeel(MetalLook);
					// 룩앤필 변경 끝
					/*SwingProject frame = new SwingProject();*/  //12번
					frame = new SwingProject();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public SwingProject() {
		setResizable(false); // 5번
		setTitle(":: 스윙 프로젝트 V1 ::"); // 4번
		setIconImage(Toolkit.getDefaultToolkit().getImage(
				SwingProject.class.getResource("/images/icon/icon.png"))); // 3번
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 10번
		// window 이벤트 처리 시작(10번)
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				JFrame frame = (JFrame) e.getSource();
				// 이벤트를 발생한 주체를 알아냄
				int result = JOptionPane.showConfirmDialog(frame,
						"정말 프로그램을 끝내시겠습니까?", "프로그램 종료",
						JOptionPane.YES_NO_OPTION);
				// 확인, 취소 버튼으로 이루어진 확인 대화상자를 모달창으로 표시
				if (result == JOptionPane.YES_OPTION)
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				// 확인대화상자에서 '확인' 버튼을 누르면 현재 프레임을 닫음
			}
		} // WindowListener
		); // WindowListener
		// window 이벤트 처리 끝(10번)

		setBounds(100, 100, 800, 600); // 1번
		setLocationRelativeTo(null); // 2번

		// 메뉴 추가 시작
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		JMenu mnFile = new JMenu(" 파 일 (F)");
		menuBar.add(mnFile);
		// 메뉴 추가 끝

		JMenuItem miNew = new JMenuItem(" 새로 만들기 (N)");
		miNew.setIcon(new ImageIcon(SwingProject.class
				.getResource("/images/menu/new.png")));
		miNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showConfirmDialog(null, "새로 만들기를 진행하시겠습니까?");
			}
		});
		mnFile.add(miNew);

		JMenuItem miOpen = new JMenuItem(" 열 기 (O)");
		mnFile.add(miOpen);

		JMenuItem miSave = new JMenuItem(" 저 장 (S)");
		mnFile.add(miSave);

		JSeparator separator = new JSeparator();
		mnFile.add(separator);

		JMenuItem miPrint = new JMenuItem(" 인 쇄 (P)");
		mnFile.add(miPrint);

		JSeparator separator_1 = new JSeparator();
		mnFile.add(separator_1);

		JMenuItem miExit = new JMenuItem(" 종 료 (X)");
		miExit.setIcon(new ImageIcon(SwingProject.class
				.getResource("/images/menu/exit.png")));
		miExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		mnFile.add(miExit);

		JMenu mnEdit = new JMenu(" 편 집 (E)");
		menuBar.add(mnEdit);

		JMenu mnView = new JMenu("  보 기 (V)");
		menuBar.add(mnView);

		JMenu mnTool = new JMenu(" 도 구 (T)");
		menuBar.add(mnTool);

		JMenu mnWindow = new JMenu(" 창 (W)");
		menuBar.add(mnWindow);

		JMenu mnHelp = new JMenu(" 도움말 (H)");
		menuBar.add(mnHelp);
		
		JMenuItem miAbout = new JMenuItem(" 스윙프로젝트에 관하여...(A)");
		miAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				AboutSwingProject dialog = new AboutSwingProject(frame);  // 12번
				dialog.setVisible(true);				
			}
		});
		mnHelp.add(miAbout);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		// JLabel 을 이용해서 이미지 표시 시작(11번)
		JLabel mainimage = new JLabel("");
		mainimage.setIcon(new ImageIcon(SwingProject.class.getResource("/images/background/cool1b.jpg")));
		// JLabel 을 이용해서 이미지 표시 끝(11번)		
		
		contentPane.add(mainimage, BorderLayout.CENTER);
	}


}
